package com.lz.concurrent.synchronize;

/**
 * SynchronizeDemo..
 *
 * 锁的升级测试
 *
 * 1. 无锁   -> 优化synchronize
 * 2. 偏向锁 -> 锁对象头HashCode设置为自己的         01
 * 3. 轻量级锁->CAS自旋                            00
 * 4. 重量级锁->用户核与内核切换 调用操作系统 Mutex   11
 *
 *
 * 锁降级在一个安全点 -> 降级
 * * @author Lizhong
 * @date 2020/4/8
 */
public class SynchronizeDemo {
    // Run with -XX:+UnlockDiagnosticVMOptions -XX:+PrintBiasedLockingStatistics -XX:TieredStopAtLevel=1

    // jdk11 失败，jdk1.8成功
    // 默认开启偏向锁
    static Lock lock = new Lock();

    static int counter = 0;

    public static void foo() {

        synchronized (lock) {
            counter++;
        }
    }


    public static void main(String[] args) throws InterruptedException {

        // lock.hashCode(); // Step 2

        // System.identityHashCode(lock); // Step 4

        for (int i = 0; i < 1_000_000; i++) {

            foo();

        }
    }

    static class Lock {

        // @Override public int hashCode() { return 0; } // Step 3

    }

}
